package com.topmap.controller;

import com.topmap.controller.viewobject.UserVO;
import com.topmap.error.BusinessException;
import com.topmap.error.EmBusinessError;
import com.topmap.response.CommonReturnType;
import com.topmap.service.UserService;
import com.topmap.service.model.UserModel;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Author: MaHuadong
 * @Date: 2019/7/17 12:29
 * @Version 1.0
 */
@Controller("/user")
@RequestMapping("/user")
//允许跨域
@CrossOrigin(allowCredentials = "true",allowedHeaders = "*")
public class UserController extends BaseController {


    @Autowired
    private UserService userService;

    //注入这个即可拿到Httpsession
    @Autowired
    private HttpServletRequest httpServletRequest;

    //根据用户的手机号查询用户信息
    //根据用户id请求用户信息接口(RESTFUL风格接口)
    @RequestMapping(value = "/get",method = RequestMethod.GET)
    @ResponseBody
    //    @ResponseBody是作用在方法上的，@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中
//    比如异步获取 json 数据，加上 @ResponseBody 后，会直接返回 json 数据。
    public CommonReturnType getUserByTel(@RequestParam(name = "telephone") String telephone
            ) throws BusinessException {
        //调用service服务获取对应id的用户对象并返回给前端,首先通过service得到一个model对象
        UserModel userModel=userService.getUserByTel(telephone);

        //若获取的信息不存在
        if (userModel==null){
            throw new BusinessException(EmBusinessError.USER_NOT_EXIT);
        }

        //然后把这个对象返回出去，并且指定reoponsebody
        //将核心领域模型对象转换为可供UI使用的viewobject
        UserVO userVO= convertFromModel(userModel);

        //返回通用对象
        return CommonReturnType.creat(userVO);

    }


    //此方法是把usermodel对应的信息返回出去，值返回前端展示需要的数据
    private UserVO convertFromModel(UserModel userModel) {
        if (userModel==null){
            return null;
        }
        //实例化
        UserVO userVO=new UserVO();
        //copy
        BeanUtils.copyProperties(userModel,userVO);
        //返回userVO
        return userVO;
    }


    //用户注册接口
    @RequestMapping(value = "/register",method = {RequestMethod.POST},consumes={CONTENT_TYPE_FORMED})
    @ResponseBody
    //需要参数：用户名，密码，手机号，年龄，邮箱
    public CommonReturnType register(@RequestParam(name = "username") String username,
                                     @RequestParam(name = "password") String password,
                                     @RequestParam(name = "telephone") String telephone,
                                     @RequestParam(name = "age") Integer age,
                                     @RequestParam(name = "email") String email
    ) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
        //开始注册，需要一个service去执行注册流程
        UserModel userModel=new UserModel();

        userModel.setUsername(username);

        //对密码做加密处理,这里使用MD5加密
       userModel.setPassword(this.EncodeByMd5(password));

        //调用service服务获取对应id的用户对象并返回给前端,首先通过service得到一个model对象
        UserModel userModel2=userService.getUserByTel(telephone);
        //若获取的信息不存在
        if (userModel2!=null){

            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"手机号重复注册！");
        }

        userModel.setTelephone(telephone);
        userModel.setAge(age);
        userModel.setEmail(email);


        userService.register(userModel);
        return CommonReturnType.creat(null);

    }


    //登录接口
    //用户登录接口
    @RequestMapping(value = "/login",method = {RequestMethod.POST},consumes={CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommonReturnType login(@RequestParam(name = "telephone") String telephone,
                                  @RequestParam(name = "password") String password) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
        //首先入参校验
        if(org.apache.commons.lang3.StringUtils.isEmpty(telephone)||
                org.apache.commons.lang3.StringUtils.isEmpty(password)){
            throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
        }

        //用户登录服务，校验用户登录是否合法
        UserModel userModel=userService.validateLogin(telephone,this.EncodeByMd5(password));

        //将登录凭证加入到用户登   录成功的session内
        /**
         * Session技术是一种将会话状态保存在服务器端的技术 ，
         * 它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
         客户端需要接收、记忆和回送 Session的会话标识号，
         Session可以且通常是借助Cookie来传递会话标识号*/
        this.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);

        this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userModel);


        //返回给前端正确的信息
        return CommonReturnType.creat(null);

    }



    //对用户密码做加密处理
    public String EncodeByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        //确定一个计算方法
        /*java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能，如 MD5 或 SHA 算法
         * */
        MessageDigest md5=MessageDigest.getInstance("MD5");
        BASE64Encoder base64Encoder=new BASE64Encoder();

        //加密字符传
        String newStr=base64Encoder.encode(md5.digest(str.getBytes("utf-8")));
        return  newStr;
    }


}
